package com.ruoyi.saas.service.impl;

import java.util.Arrays;
import java.util.List;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.saas.domain.CTenant;
import com.ruoyi.saas.dto.TenantConnectDTO;
import com.ruoyi.saas.enums.TenantConnectTypeEnum;
import com.ruoyi.saas.enums.TenantStatusEnum;
import com.ruoyi.saas.enums.TenantTypeEnum;
import com.ruoyi.saas.mapper.CTenantMapper;
import com.ruoyi.saas.service.ICTenantService;
import com.ruoyi.saas.strategy.InitSystemContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static cn.hutool.core.lang.Assert.isFalse;

/**
 * 租户信息Service业务层处理
 * 
 * @author ruoyi
 * @date 2021-11-02
 */
@Service
public class CTenantServiceImpl implements ICTenantService
{
    @Autowired
    private CTenantMapper cTenantMapper;
    @Autowired
    InitSystemContext initSystemContext;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean connect(TenantConnectDTO tenantConnect) {
        return initSystemContext.initConnect(tenantConnect) && updateTenantStatus(tenantConnect);
    }

    private Boolean updateTenantStatus(TenantConnectDTO tenantConnect) {
        CTenant t= new CTenant();
        t.setConnectType(tenantConnect.getConnectType().value);
        t.setId(tenantConnect.getId());
        t.setStatus(TenantStatusEnum.NORMAL.value);
        Boolean flag = updateCTenant(t)==1?true:false;
        return flag;
    }


    @Override
    public boolean check(String tenantCode) {
        CTenant tenant=new CTenant();
        tenant.setCode(tenantCode);
        return cTenantMapper.selectCTenantList(tenant).size()>0?true:false;
    }


    /**
     * 查询租户信息
     * 
     * @param id 租户信息ID
     * @return 租户信息
     */
    @Override
    public CTenant selectCTenantById(Long id)
    {
        return cTenantMapper.selectCTenantById(id);
    }

    /**
     * 查询租户信息列表
     * 
     * @param cTenant 租户信息
     * @return 租户信息
     */
    @Override
    public List<CTenant> selectCTenantList(CTenant cTenant)
    {
        return cTenantMapper.selectCTenantList(cTenant);
    }

    /**
     * 新增租户信息
     * 
     * @param cTenant 租户信息
     * @return 结果
     */
    @Override
    public int insertCTenant(CTenant cTenant)
    {
        // defaults 库
        isFalse(check(cTenant.getCode()), "编码重复，请重新输入");

        cTenant.setStatus(TenantStatusEnum.WAIT_INIT.value);
        cTenant.setType(TenantTypeEnum.CREATE.value);

        cTenant.setCreateTime(DateUtils.getNowDate());
        return cTenantMapper.insertCTenant(cTenant);
    }




    /**
     * 修改租户信息
     * 
     * @param cTenant 租户信息
     * @return 结果
     */
    @Override
    public int updateCTenant(CTenant cTenant)
    {
        cTenant.setUpdateTime(DateUtils.getNowDate());
        return cTenantMapper.updateCTenant(cTenant);
    }

    /**
     * 批量删除租户信息
     * 
     * @param ids 需要删除的租户信息ID
     * @return 结果
     */
    @Override
    public int deleteCTenantByIds(Long[] ids)
    {
        List<String> tenantCodeList = cTenantMapper.selectCTenantCodeListByIds(ids);
        if (tenantCodeList.isEmpty()) {
            return 0;
        }
        int code= initSystemContext.delete(Arrays.asList(ids), tenantCodeList);
        return code==1?cTenantMapper.deleteCTenantByIds(ids):code;

    }

    /**
     * 删除租户信息信息
     * 
     * @param id 租户信息ID
     * @return 结果
     */
    @Override
    public int deleteCTenantById(Long id)
    {
        return cTenantMapper.deleteCTenantById(id);
    }

    @Override
    public int updateStatus(List<Long> ids, TenantStatusEnum status) {

        return cTenantMapper.updateTenantStatus(ids,status.value);
    }

    @Override
    public CTenant selectCTenantByTenantCode(String tenantCode) {
        return cTenantMapper.selectCTenantByTenantCode(tenantCode);
    }
}
